package com.resifind.www.service;

import com.resifind.www.exception.Resp;
import com.resifind.www.po.Order;

import java.util.List;

/**
 * @author 36069
 */
public interface OrderService {

    /**
     * 查询订单信息
     * <p>
     * 根据用户类型判断查询客户还是商户的订单。
     * </p>
     *
     * @param userId   用户id
     * @param userType 用户类型
     * @return 返回订单信息
     */
    Resp<List<Order>> queryOrderByUserId(int userId, String userType);

    /**
     * 下单
     * <p>
     * 检查房间是否可用，
     * 根据房型id查询房型和商家，获取商家id和价格，
     * 创建订单，更新房间为不可用，并更新销量和库存。
     * </p>
     *
     * @param clientId     客户id
     * @param roomId       房型id
     * @param roomNumberId 房间id
     * @return 返回下单结果
     */
    Resp<String> orderRoom(int clientId, int roomId, int roomNumberId);

    /**
     * 取消订单
     * <p>
     * 订单状态是待支付的可以取消订单
     * 取消后更新房间为可用，更新销量和库存。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回取消结果
     */
    Resp<String> cancelOrder(int orderId);

    /**
     * 申请退款
     * <p>
     * 只有支付状态为已支付且未入住的才能申请退款。
     * 更新订单状态为退款中。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回退款申请结果
     */
    Resp<String> applyRefund(int orderId);

    /**
     * 修改入住状态为已入住
     * <p>
     * 只有支付状态为已支付和入住状态为未入住的才能入住。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回结果
     */
    Resp<String> checkIn(int orderId);

    /**
     * 修改入住状态为已退房
     * <p>
     * 只有入住状态为已入住的才能退房。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回结果
     */
    Resp<String> checkOut(int orderId);

    /**
     * 删除订单
     *
     * @param orderId 订单id
     * @return 返回删除结果
     */
    Resp<String> deleteOrder(int orderId);

    /**
     * 支付订单
     * <p>
     * 只有支付状态为待支付的才能支付。
     * 支付后更新两端的钱款。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回支付结果
     */
    Resp<String> payOrder(int orderId);

    /**
     * 退款
     * <p>
     * 只有退款状态为退款中才能退款。
     * 退款后更新两端的钱款，更新房间为可用，更新销量和库存。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回退款结果
     */
    Resp<String> refund(int orderId);

    /**
     * 拒绝退款
     * <p>
     * 只有退款状态为退款中才能拒绝退款。
     * </p>
     *
     * @param orderId 订单id
     * @return 返回拒绝退款结果
     */
    Resp<String> refuseRefund(int orderId);
}
